/*
 * 
 * Author: Adriano
 */
package Limite;

import Controle.Algoritmo;
import Controle.ControleLinks;
import Controle.ControleNos;
import Controle.Floyd;
import Entidades.Link;
import Entidades.LocalizadoraDeNos;
import Entidades.LocalizadoraLinks;
import Entidades.No;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.geom.Rectangle2D;
import java.io.*;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.tree.TreeNode;
import org.jgraph.JGraph;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.DefaultGraphModel;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.GraphModel;

/**
 *
 * @author HP
 */
public class Apresentacao extends javax.swing.JFrame {

    private JGraph graph;//ponteiro para o Jgraph1 da tela
    private ArrayList<DefaultGraphCell> nosGraph = new ArrayList<DefaultGraphCell>();
    ArrayList<DefaultEdge> Links = new ArrayList<DefaultEdge>();
    public ArrayList<No> rota = new ArrayList<No>();
    public ArrayList<No> nos = new ArrayList<No>();
    public int total = 0;

    //metodo atualiza o jgraph1
    public void atualiza() {
        try {
            //desceleciona celulas
            if (this.jGraph1.getSelectionCells().length > 0) {
                DefaultGraphCell cell = new DefaultGraphCell();
                this.jGraph1.getGraphLayoutCache().insert(cell);
                this.jGraph1.setSelectionCell(cell);
                Object[] array = new Object[1];
                array[0] = cell;
                this.jGraph1.getGraphLayoutCache().remove(array);

            }
            graph.update(graph.getGraphics());
            graph.getGraphLayoutCache().reload();
            graph.updateUI();
        } catch (Exception e) {
        }
    }

    //cria um nó na tela
    public void insereNoNaTela(int x, int y, int id) {
        DefaultGraphCell cell = createVertex(String.valueOf(id), x, y, 20, 20, Color.GREEN, false);
        this.jGraph1.getGraphLayoutCache().insert(cell);
        tArea_coord.append(x + " " + y + "\n");
        nosGraph.add(cell);
    }

    //recupera um link(DefaultEdge) passando o identificador de sua origem e destino
    public DefaultEdge getLink(int idA, int idB) {
        for (int i = 0; i < Links.size(); i++) {
            try {
                DefaultEdge edge = Links.get(i);
                //verifica com os objetos
                if (edge.getSource() == getNo(idA).getChildAt(0) && edge.getTarget() == getNo(idB).getChildAt(0)) {
                    return edge;
                } else {
                    if (edge.getSource() == getNo(idB).getChildAt(0) && edge.getTarget() == getNo(idA).getChildAt(0)) {
                        return edge;
                    }
                }
                TreeNode childA = (TreeNode) edge.getSource();
                DefaultGraphCell cellA = (DefaultGraphCell) childA.getParent();
                TreeNode childB = (TreeNode) edge.getTarget();
                DefaultGraphCell cellB = (DefaultGraphCell) childB.getParent();
                int sourceId = Integer.valueOf(cellA.getUserObject().toString());
                int targetId = Integer.valueOf(cellB.getUserObject().toString());
                if (sourceId == idA && targetId == idB) {
                    return edge;
                } else {
                    if (sourceId == idB && targetId == idA) {
                        return edge;
                    }
                }
            } catch (Exception e) {
                // System.out.println("Exceção gerada ao buscar o link: " + idA + ":" + idB + " -->" + e.getMessage() + ". Classe Apresentação, método getLink(int x,int y)");
            }
        }
        return null;
    }

    //coloca todos os links de cor preta e todos os nós de cor verde
    public void reset() {
        try {
            for (int i = 0; i < Links.size(); i++) {
                DefaultEdge edge = (DefaultEdge) Links.get(i);
                GraphConstants.setLineColor(edge.getAttributes(), Color.BLACK);
            }
            for (int i = 0; i < nosGraph.size(); i++) {
                DefaultGraphCell cell = (DefaultGraphCell) nosGraph.get(i);
                GraphConstants.setGradientColor(cell.getAttributes(), Color.GREEN);
            }
        } catch (Exception erro) {
            System.out.println("Erro no Reset");
            System.out.println(erro.getMessage());
        }
    }

    //recupera um nó DefaultGraphCell de acordo com seu identificador
    public DefaultGraphCell getNo(int id) {
        String idString = String.valueOf(id);
        for (int i = 0; i < nosGraph.size(); i++) {
            DefaultGraphCell cell = (DefaultGraphCell) nosGraph.get(i);
            if (cell.getUserObject().toString().equals(idString)) {
                return cell;
            }
        }
        return null;
    }

    //passando uma origem e um destino o link entre os dois pontso é marcado de vermelho
    public void marcaCaminho(int idA, int idB) {
        GraphConstants.setLineColor(getLink(idA, idB).getAttributes(), Color.red);
    }

    public void marcaCaminho(ArrayList<Link> links) {
        System.out.println("Links: " + links);

        for (int i = 0; i < links.size(); i++) {
            Link l = links.get(i);
            No noA = l.getOrigem();
            No noB = l.getDestino();
            GraphConstants.setLineColor(getLink(noA.getIdentificador(), noB.getIdentificador()).getAttributes(), Color.red);
            atualiza();
            total += l.getDistancia();
        }
        this.jTextField2.setText(total + "");
//        this.jTextField2.setText(String.valueOf(ControleNos.distancia(rota)));


    }

    //insere a distância entre dois links na tela.
    public void registraDistancia(int idA, int idB, double distancia) {
        getLink(idA, idB).setUserObject(String.valueOf(Math.round(distancia)));
    }

    //cria um link (DefaultEdge) na tela
    public DefaultEdge insereLink(int idA, int idB) {
        if (!(Controle.ControleLinks.existeId(idA, idB))) {
            DefaultGraphCell noA = null;
            DefaultGraphCell noB = null;
            noA = getNo(idA);
            noB = getNo(idB);
            DefaultEdge edge = new DefaultEdge();
            edge.setSource(noA.getChildAt(0));
            edge.setTarget(noB.getChildAt(0));
            GraphConstants.setLineEnd(edge.getAttributes(), GraphConstants.ARROW_NONE);
            GraphConstants.setEndFill(edge.getAttributes(), true);

            //insere Link no modelo de apresentacao e na tela
            Links.add(edge);
            graph.getGraphLayoutCache().insert(edge);

            // cadastra no modelo lógico
            Controle.ControleLinks.cadastraLinksIDs(idA, idB);
            return edge;
        }
        return null;
    }

    //cria um link (DefaultEdge) na tela
    public DefaultEdge insereLink(int idA, int idB, Color cor) {
        if (!(Controle.ControleLinks.existeId(idA, idB))) {
            DefaultGraphCell noA = null;
            DefaultGraphCell noB = null;
            noA = getNo(idA);
            noB = getNo(idB);
            DefaultEdge edge = new DefaultEdge();
            edge.setSource(noA.getChildAt(0));
            edge.setTarget(noB.getChildAt(0));
            GraphConstants.setLineColor(edge.getAttributes(), cor);
            GraphConstants.setLineEnd(edge.getAttributes(), GraphConstants.ARROW_NONE);
            GraphConstants.setEndFill(edge.getAttributes(), true);

            //insere Link no modelo de apresentacao e na tela
            Links.add(edge);
            graph.getGraphLayoutCache().insert(edge);

            // cadastra no modelo lógico
            Controle.ControleLinks.cadastraLinksIDs(idA, idB);
            return edge;
        }
        return null;
    }

    //construtor da tela
    public Apresentacao() {

        GraphModel model = new DefaultGraphModel();
        GraphModel model2 = new DefaultGraphModel();
        this.setLocationRelativeTo(null);
        initComponents();
        this.setMinimumSize(this.getPreferredSize());
        Dimension telaComputador = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds((telaComputador.width - this.getWidth()) / 2, (telaComputador.height - this.getHeight()) / 2, 700, 440);
//        this.jGraph2.setModel(model2);
        graph = this.jGraph1;
        graph.setModel(model);
        this.setExtendedState(MAXIMIZED_BOTH);
        this.atualiza();

    }

    //método utilizado para criar nós no jgraph.
    private static DefaultGraphCell createVertex(String name, double x, double y, double w, double h, Color bg, boolean raised) {
        // Create vertex with the given name
        DefaultGraphCell cell = new DefaultGraphCell(name);
        // Set bounds
        GraphConstants.setBounds(cell.getAttributes(), new Rectangle2D.Double(x, y, w, h));

        // Set fill color
        if (bg != null) {
            GraphConstants.setGradientColor(cell.getAttributes(), bg);
            GraphConstants.setOpaque(cell.getAttributes(), true);
        }
        // Set raised border
        if (raised) {
            GraphConstants.setBorder(cell.getAttributes(), BorderFactory.createRaisedBevelBorder());
        } else // Set black border
        {
            GraphConstants.setBorderColor(cell.getAttributes(), Color.black);
        }
        // Add a Floating Port
        cell.addPort();
        return cell;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        painel_CW = new javax.swing.JPanel();
        jGraph1 = new org.jgraph.JGraph();
        botoes_CW = new javax.swing.JPanel();
        jLabel7 = new javax.swing.JLabel();
        botao_abrir = new javax.swing.JButton();
        caminho = new javax.swing.JTextField();
        bt_inserir = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        tArea_coord = new javax.swing.JTextArea();
        botao_salvar = new javax.swing.JButton();
        jPanel_cw = new javax.swing.JPanel();
        jButtonBusca1 = new javax.swing.JButton();
        jButtonBusca2 = new javax.swing.JButton();
        jLabel6 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jTextField2 = new javax.swing.JTextField();
        jTextField1 = new javax.swing.JTextField();
        jPanel_floyd = new javax.swing.JPanel();
        jcbox_destino = new javax.swing.JComboBox();
        jLabel10 = new javax.swing.JLabel();
        jcbox_origem = new javax.swing.JComboBox();
        jLabel2 = new javax.swing.JLabel();
        jb_exec_floyd = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Clarke Wright");
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                formMouseClicked(evt);
            }
        });

        painel_CW.setBackground(new java.awt.Color(255, 255, 255));
        painel_CW.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));

        jGraph1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jGraph1.setAutoscrolls(true);
        jGraph1.setEditable(false);
        jGraph1.setGridSize(7.0);
        jGraph1.setGridVisible(true);
        jGraph1.setMoveBeyondGraphBounds(false);
        jGraph1.setMoveable(false);
        jGraph1.setTolerance(1);
        jGraph1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jGraph1MouseClicked(evt);
            }
        });
        jGraph1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                jGraph1KeyTyped(evt);
            }
        });

        javax.swing.GroupLayout painel_CWLayout = new javax.swing.GroupLayout(painel_CW);
        painel_CW.setLayout(painel_CWLayout);
        painel_CWLayout.setHorizontalGroup(
            painel_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 1316, Short.MAX_VALUE)
            .addGroup(painel_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(painel_CWLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jGraph1, javax.swing.GroupLayout.DEFAULT_SIZE, 1296, Short.MAX_VALUE)
                    .addContainerGap()))
        );
        painel_CWLayout.setVerticalGroup(
            painel_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 425, Short.MAX_VALUE)
            .addGroup(painel_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, painel_CWLayout.createSequentialGroup()
                    .addContainerGap()
                    .addComponent(jGraph1, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE)
                    .addContainerGap()))
        );

        jLabel7.setText("Arquivo (Um Nó por linha, posição X Y na tela,");

        botao_abrir.setText("Abrir");
        botao_abrir.setFocusable(false);
        botao_abrir.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botao_abrir.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botao_abrir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botao_abrirActionPerformed(evt);
            }
        });

        caminho.setEnabled(false);
        caminho.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                caminhoActionPerformed(evt);
            }
        });

        bt_inserir.setText("Inserir");
        bt_inserir.setFocusable(false);
        bt_inserir.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        bt_inserir.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        bt_inserir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_inserirActionPerformed(evt);
            }
        });

        tArea_coord.setColumns(20);
        tArea_coord.setRows(5);
        jScrollPane1.setViewportView(tArea_coord);

        botao_salvar.setText("Salvar");
        botao_salvar.setFocusable(false);
        botao_salvar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        botao_salvar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        botao_salvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botao_salvarActionPerformed(evt);
            }
        });

        jPanel_cw.setBorder(javax.swing.BorderFactory.createTitledBorder("Clarke Wright"));

        jButtonBusca1.setText("Caminhos");
        jButtonBusca1.setFocusable(false);
        jButtonBusca1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonBusca1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButtonBusca1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonBusca1ActionPerformed(evt);
            }
        });

        jButtonBusca2.setText("Executa");
        jButtonBusca2.setFocusable(false);
        jButtonBusca2.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonBusca2.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButtonBusca2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonBusca2ActionPerformed(evt);
            }
        });

        jLabel6.setText("Maior distância: ");

        jLabel8.setText("Menor distância: ");

        jTextField2.setEditable(false);

        jTextField1.setEditable(false);

        javax.swing.GroupLayout jPanel_cwLayout = new javax.swing.GroupLayout(jPanel_cw);
        jPanel_cw.setLayout(jPanel_cwLayout);
        jPanel_cwLayout.setHorizontalGroup(
            jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel_cwLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(jPanel_cwLayout.createSequentialGroup()
                        .addComponent(jButtonBusca1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jButtonBusca2, javax.swing.GroupLayout.DEFAULT_SIZE, 79, Short.MAX_VALUE))
                    .addGroup(jPanel_cwLayout.createSequentialGroup()
                        .addGroup(jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel6)
                            .addComponent(jLabel8))
                        .addGap(11, 11, 11)
                        .addGroup(jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jTextField2)
                            .addComponent(jTextField1))))
                .addContainerGap(16, Short.MAX_VALUE))
        );
        jPanel_cwLayout.setVerticalGroup(
            jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel_cwLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButtonBusca1)
                    .addComponent(jButtonBusca2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6))
                .addGap(1, 1, 1)
                .addGroup(jPanel_cwLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel_floyd.setBorder(javax.swing.BorderFactory.createTitledBorder("Floyd"));

        jLabel10.setText("Destino");

        jLabel2.setText("Origem");

        jb_exec_floyd.setText("Executa");
        jb_exec_floyd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jb_exec_floydActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel_floydLayout = new javax.swing.GroupLayout(jPanel_floyd);
        jPanel_floyd.setLayout(jPanel_floydLayout);
        jPanel_floydLayout.setHorizontalGroup(
            jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel_floydLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel_floydLayout.createSequentialGroup()
                        .addGroup(jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel2)
                            .addComponent(jLabel10))
                        .addGroup(jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel_floydLayout.createSequentialGroup()
                                .addGap(47, 47, 47)
                                .addComponent(jcbox_destino, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel_floydLayout.createSequentialGroup()
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jcbox_origem, javax.swing.GroupLayout.PREFERRED_SIZE, 71, javax.swing.GroupLayout.PREFERRED_SIZE))))
                    .addGroup(jPanel_floydLayout.createSequentialGroup()
                        .addGap(37, 37, 37)
                        .addComponent(jb_exec_floyd, javax.swing.GroupLayout.PREFERRED_SIZE, 73, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel_floydLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jcbox_destino, jcbox_origem});

        jPanel_floydLayout.setVerticalGroup(
            jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel_floydLayout.createSequentialGroup()
                .addGap(8, 8, 8)
                .addComponent(jb_exec_floyd)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jcbox_origem, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel_floydLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jcbox_destino, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel10))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout botoes_CWLayout = new javax.swing.GroupLayout(botoes_CW);
        botoes_CW.setLayout(botoes_CWLayout);
        botoes_CWLayout.setHorizontalGroup(
            botoes_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(botoes_CWLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(botao_abrir)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botao_salvar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(botoes_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(botoes_CWLayout.createSequentialGroup()
                        .addGap(66, 66, 66)
                        .addComponent(bt_inserir))
                    .addComponent(jLabel7)
                    .addGroup(botoes_CWLayout.createSequentialGroup()
                        .addGap(17, 17, 17)
                        .addGroup(botoes_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(caminho)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(37, 37, 37)))
                .addGap(27, 27, 27)
                .addComponent(jPanel_cw, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanel_floyd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        botoes_CWLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {botao_abrir, botao_salvar});

        botoes_CWLayout.setVerticalGroup(
            botoes_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(botoes_CWLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(botoes_CWLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(botoes_CWLayout.createSequentialGroup()
                        .addComponent(caminho, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(bt_inserir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel7))
                    .addComponent(botao_abrir)
                    .addComponent(botao_salvar)
                    .addComponent(jPanel_floyd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jPanel_cw, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(painel_CW, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(botoes_CW, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(botoes_CW, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(painel_CW, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked
    }//GEN-LAST:event_formMouseClicked

    //insere valor no campo melhor distância
    public void insereMelhorDistância(double distancia) {
        this.jTextField1.setText(String.valueOf(Math.round(distancia)));
    }

    /**
     *
     * @param id
     */
    private void adicionaValorCombos(int id) {
        String idnt = String.valueOf(id);
    }

    /**
     * remove um valor de todas as combos
     */
    private void removeValorCombos(int id) {
        String idnt = String.valueOf(id);
    }

    /**
     * passado um celula é retornado seu identificador
     *
     * @param cell
     * @return
     */
    private int getNoId(DefaultGraphCell cell) {
        return Integer.valueOf(cell.getUserObject().toString());
    }

    public void deletaLink(DefaultEdge edge) {
        //recupera o código dos nós de origem e destino
        TreeNode childA = (TreeNode) edge.getSource();
        DefaultGraphCell cellA = (DefaultGraphCell) childA.getParent();
        TreeNode childB = (TreeNode) edge.getTarget();
        DefaultGraphCell cellB = (DefaultGraphCell) childB.getParent();

        int sourceId = Integer.valueOf(cellA.getUserObject().toString());
        int targetId = Integer.valueOf(cellB.getUserObject().toString());

        //exclui o link do modelo lógico
        Controle.ControleLinks.excluiLink(sourceId, targetId);
        //exclui o link do modelo de apresentação
        this.Links.remove(edge);
        //remove link da tela
        Object[] array = new Object[1];
        array[0] = edge;
        this.jGraph1.getGraphLayoutCache().remove(array);
    }
    private void jButtonBusca1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonBusca1ActionPerformed
        this.caminho();
        ControleLinks.listaTodosLinks();
        System.out.println("_______________");
        ControleNos.mostraNos();
    }//GEN-LAST:event_jButtonBusca1ActionPerformed

    private void jButtonBusca2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonBusca2ActionPerformed
        this.executa();
    }//GEN-LAST:event_jButtonBusca2ActionPerformed

    /**
     * deleta uma celula quando pressionado DELETE
     *
     * @param evt
     */
    private void jGraph1KeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jGraph1KeyTyped

        if ((int) evt.getKeyChar() == 127) {
            for (int i = 0; i
                    < this.jGraph1.getSelectionCells().length; i++) {
                try {
                    DefaultEdge edge = (DefaultEdge) this.jGraph1.getSelectionCells()[i];
                    this.deletaLink(edge);
                } catch (Exception e) {
                    try {
                        DefaultGraphCell cell = (DefaultGraphCell) this.jGraph1.getSelectionCells()[i];
                        int codigo = getNoId(cell);
                        removeValorCombos(codigo);
                        //remove o nó do modelo de apresentação
                        this.nosGraph.remove(cell);
                        if (Links.contains(cell.getChildren().get(0))) {
                            Links.remove(cell.getChildren().get(0));
                        }

                        cell.removeAllChildren();

                        //remove todos os links ligados ao nó do modelo lógico
                        Controle.ControleLinks.removeTodosOsLinksPorNo(codigo);
                        //remove o nó do modelo lógico
                        Entidades.LocalizadoraDeNos.removeNo(codigo);
                        //remove nó da tela
                        Object[] array = new Object[1];
                        array[0] = cell;
                        this.jGraph1.getGraphLayoutCache().remove(array);
                    } catch (Exception e1) {
                    }
                }
            }

        }
        atualiza();
    }//GEN-LAST:event_jGraph1KeyTyped

    /**
     * evento do mouse, com um clique link pontos selecionados com dois cliques
     * cria um nó na posição clicada.
     *
     * @param evt
     */
    private void jGraph1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jGraph1MouseClicked
        //insere link
        try {
            if (evt.getClickCount() == 1) {
                if (this.jGraph1.getSelectionCells().length == 2) {
                    //verifica se não são arestas
                    try {
                        DefaultEdge edge = (DefaultEdge) this.jGraph1.getSelectionCells()[0];
                        return;
                    } catch (Exception e) {
                    }
                    try {
                        DefaultEdge edge = (DefaultEdge) this.jGraph1.getSelectionCells()[1];
                        return;
                    } catch (Exception e) {
                    }

                    //se não são arestas enão são dois nós e poderão ser ligados
                    int origem = this.getNoId((DefaultGraphCell) this.jGraph1.getSelectionCells()[0]);
                    int destino = this.getNoId((DefaultGraphCell) this.jGraph1.getSelectionCells()[1]);
                    if (origem == destino) {
                        return;
                    }

                    insereLink(origem, destino);
                    this.registraDistancia(origem, destino, ControleNos.calculaDistancia(Entidades.LocalizadoraDeNos.busca(origem), Entidades.LocalizadoraDeNos.busca(destino)));
                    DefaultGraphCell selecionada = (DefaultGraphCell) this.jGraph1.getSelectionCells()[1];
                    this.atualiza();
                    this.jGraph1.setSelectionCell(selecionada);
                    return;
                }
            }
            //insere nó
            if (evt.getClickCount() == 2) {
                int x = evt.getX();
                int y = evt.getY();
                int codigo = Controle.ControleNos.cadastraNo(x, y);
                adicionaValorCombos(codigo);
                insereNoNaTela(x, y, codigo);
                //insere nó na JComboBox 
                jcbox_origem.addItem(LocalizadoraDeNos.getUltimoCodigo() - 1);
                jcbox_destino.addItem(LocalizadoraDeNos.getUltimoCodigo() - 1);

            }
        } catch (Exception e) {
            //trata erros gerados pelo Jgraph
        }
    }//GEN-LAST:event_jGraph1MouseClicked

    private void caminhoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_caminhoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_caminhoActionPerformed

    private void bt_inserirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_inserirActionPerformed
//        inserirNos();

        String txCoord = tArea_coord.getText();
        tArea_coord.setText("");
        String[] coords = txCoord.split("\n");
        ArrayList<String> linhas = new ArrayList<String>();
        linhas.addAll(Arrays.asList(coords));
        nos.clear();
        nos = coordToNo(linhas);
        inserirNos(nos);
        


    }//GEN-LAST:event_bt_inserirActionPerformed

    private void botao_abrirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botao_abrirActionPerformed
        ArrayList<No> nos = lerArquivo(abrirArquivo());
        if (!nos.isEmpty()) {
            inserirNos(nos);
        }
    }//GEN-LAST:event_botao_abrirActionPerformed

    private void botao_salvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botao_salvarActionPerformed
        salvarArquivo();

    }//GEN-LAST:event_botao_salvarActionPerformed

    private void jb_exec_floydActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jb_exec_floydActionPerformed
        Floyd floyd = new Floyd();
        floyd.executa(this);
    }//GEN-LAST:event_jb_exec_floydActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Apresentacao().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botao_abrir;
    private javax.swing.JButton botao_salvar;
    private javax.swing.JPanel botoes_CW;
    private javax.swing.JButton bt_inserir;
    private javax.swing.JTextField caminho;
    private javax.swing.JButton jButtonBusca1;
    private javax.swing.JButton jButtonBusca2;
    private org.jgraph.JGraph jGraph1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel_cw;
    private javax.swing.JPanel jPanel_floyd;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    public javax.swing.JButton jb_exec_floyd;
    public javax.swing.JComboBox jcbox_destino;
    public javax.swing.JComboBox jcbox_origem;
    private javax.swing.JPanel painel_CW;
    private javax.swing.JTextArea tArea_coord;
    // End of variables declaration//GEN-END:variables

    private void caminho() {
        //se não são arestas enão são dois nós e poderão ser ligados        
        int total = 0;

        int origem = 1;
        No noOrigem = Entidades.LocalizadoraDeNos.busca(origem);
//        rota.add(noOrigem);
        Entidades.LocalizadoraDeNos.busca(origem).seteFinal(0);
        for (int i = 2; i <= nosGraph.size(); i++) {

            int destino = i;
            Entidades.LocalizadoraDeNos.busca(destino).seteFinal(1);
            Entidades.LocalizadoraDeNos.busca(destino).setPredecessor(noOrigem);
//            if(ControleLinks.existeId(destino)){
            insereLink(origem, destino);
            double distancia = ControleNos.calculaDistancia(Entidades.LocalizadoraDeNos.busca(origem),
                    Entidades.LocalizadoraDeNos.busca(destino));
            this.registraDistancia(origem, destino, distancia);
            this.atualiza();
//            }
            total += distancia * 2;

        }
        this.jTextField1.setText(String.valueOf(Math.round(total)));
    }

    private void executa() {
        int numNos = nosGraph.size();

        for (int origem = 2; origem <= numNos; origem++) {
            for (int destino = origem + 1; destino <= numNos; destino++) {
                insereLink(origem, destino, Color.GRAY);
                this.registraDistancia(origem, destino, ControleNos.calculaDistancia(Entidades.LocalizadoraDeNos.busca(origem),
                        Entidades.LocalizadoraDeNos.busca(destino)));
                this.atualiza();
            }
        }

        ArrayList<Link> v = ControleLinks.getTodosLinks();
        Link link = null;
        for (int i = 0; i < v.size(); i++) {
            link = (Link) v.get(i);
            System.out.println(link.getOrigem().getIdentificador() + " - " + link.getDestino().getIdentificador());
        }


        ArrayList<Link> linkx = ControleLinks.getTodosLinks();
        ArrayList<No> nox = LocalizadoraDeNos.getLista();
        NavigableMap matrixS = criaMatrizGanhos(linkx, nox);

        ArrayList<ArrayList<Link>> roteiros = executaCW(matrixS);

        System.out.println("Roteiros: " + roteiros);
        for (ArrayList<Link> r : roteiros) {
            marcaCaminho(r);
        }



        rota.add(Entidades.LocalizadoraDeNos.busca(1));

        this.reset();
    }

    public NavigableMap criaMatrizGanhos(ArrayList<Link> links, ArrayList<No> nos) {

        NavigableMap<Double, Link> matrixS = new TreeMap<Double, Link>();

        Link link = (Link) links.get(0);
        No no;
        double di, dj, ij, S;

        int cont = 0;
        no = link.getOrigem();


        for (int i = 0; i < nos.size() - 1; i++) {

            link = (Link) links.get(i);

            ArrayList<Link> l = ControleLinks.getLinksByNo(link.getDestino());
            for (int j = 0; j < l.size(); j++) {
                di = ControleLinks.getDistanciaReal(no, link.getDestino());
                Link x = l.get(j);
                dj = ControleLinks.getDistanciaReal(no, x.getDestino());
                ij = ControleLinks.getDistanciaReal(link.getDestino(), x.getDestino());
                S = (di + dj) - ij;
                matrixS.put(S, x);

                cont++;
//                System.out.println(" di: " + di + " dj: " + dj + " ij: " + ij + " S: " + S);
            }
        }

        matrixS = matrixS.descendingMap();

//        for (int i = 0; i < matrixS.size(); i++) {
//            matrixS[i]= (Double) mS.get(i);
//            System.out.println(""+(Double) matrixS.get(i));
//        }
//        
//        for (int i = 0; i < matrixS.length; i++) {
//            System.out.println(""+matrixS[i]);
//        }

        return matrixS;
    }

    public ArrayList<ArrayList<Link>> executaCW(NavigableMap matrixS) {
        ArrayList<Link> roteiro = new ArrayList<Link>();
        ArrayList<ArrayList<Link>> roteiros = new ArrayList<ArrayList<Link>>();
        ArrayList<Link> linkUsados = new ArrayList<Link>();

        int nNos = LocalizadoraDeNos.getLista().size();

        do {

            //Captura o primeiro Link da matriz de Ganho
            Link link = (Link) matrixS.get(matrixS.firstKey());
            //Remove da matriz a aresta
            System.out.println("Matrix cont: " + matrixS.size() + " . " + link + " roteiro: " + roteiro);

            System.out.println("qtnos: " + getQtNos(linkUsados) + " nossize: " + nosGraph.size() + "link.usados: " + linkUsados);

            if (getQtNos(linkUsados) == (nosGraph.size() - 1)) {
                insereNoExtremo(roteiro);
                roteiros.add(roteiro);
                return roteiros;
            }

            //verifica se o roteiro está vazio, se sim, então insere a aresta de maior ganho no roteiro
            if (roteiro.isEmpty()) {
                System.out.println("first: " + link);

                roteiro.add(link);
                linkUsados.add(link);
                matrixS.remove(matrixS.firstKey());

            } //se não, ele verifica Se exatamente um dos pontos i ou j já pertencem a algum roteiro aberto
            else if ((ControleLinks.existeOrigem(link.getOrigem(), link.getDestino(), roteiro)) ^ (ControleLinks.existeDestino(link.getDestino(), link.getOrigem(), roteiro))) {
                ArrayList<Link> extremos = ControleLinks.getExtremo(roteiro);
                boolean origem = (ControleLinks.existeOrigem(link.getOrigem(), link.getDestino(), roteiro));
                boolean destino = (ControleLinks.existeDestino(link.getDestino(), link.getOrigem(), roteiro));

                System.out.println("Origem: " + origem + " Destino: " + destino);

//                if (((link.getOrigem() == extremos.firstElement()) || (link.getOrigem() == extremos.lastElement())) || ((link.getDestino() == extremos.firstElement()) || (link.getDestino() == extremos.lastElement()))) {
                System.out.println("um dos pontos i ou j pertencem a algum roteiro aberto: " + link);
                roteiro.add(link);
                linkUsados.add(link);
                matrixS.remove(matrixS.firstKey());
//                }

            } //            //Se não ele testa se os dois nos possuem roteiros diferentes
            else if ((ControleLinks.existeOrigem(link.getOrigem(), link.getDestino(), roteiro)) && (ControleLinks.existeDestino(link.getDestino(), link.getOrigem(), roteiro))) {
                matrixS.remove(matrixS.firstKey());


            }//SE NÃO CRIA NOVO ROTEIRO
            else {
                System.out.println("Crianovo roteiro: L: " + link + " rota: " + roteiro);
                System.out.println("extremos: " + ControleLinks.getExtremo(roteiro));

                insereNoExtremo(roteiro);
                roteiros.add(roteiro);

                roteiro = new ArrayList<Link>();

            }

            //Se não, então realiza os testes
        } while (!matrixS.isEmpty());
//        No pri = (No) ControleLinks.getExtremo(roteiro).get(0);
//        No ult = (No) ControleLinks.getExtremo(roteiro).get(1);
//        Link ultLink = new Link(ControleNos.getNo(1), ult, ControleNos.calculaDistancia(ControleNos.getNo(1), ult));
//        Link priLink = new Link(ControleNos.getNo(1), pri, ControleNos.calculaDistancia(ControleNos.getNo(1), pri));
//        roteiro.add(priLink);
//        roteiro.add(ultLink);
        insereNoExtremo(roteiro);
        roteiros.add(roteiro);
        return roteiros;
    }

    public int getQtNos(ArrayList<Link> roteiros) {
        ArrayList<No> nos = new ArrayList<No>();
        for (Link l : roteiros) {
            if (nos.isEmpty()) {
                nos.add(l.getOrigem());
                nos.add(l.getDestino());
            }
            if (!nos.contains(l.getOrigem())) {
                nos.add(l.getOrigem());
            }
            if (!nos.contains(l.getDestino())) {
                nos.add(l.getDestino());
            }
        }
        return nos.size();
    }

    public ArrayList<Link> insereNoExtremo(ArrayList<Link> roteiros) {
        ArrayList<No> nos = ControleLinks.getExtremo(roteiros);
        No pri = nos.get(0);
        No ult = nos.get(1);
        Link ultLink = new Link(ControleNos.getNo(1), ult, ControleNos.calculaDistancia(ControleNos.getNo(1), ult));
        Link priLink = new Link(ControleNos.getNo(1), pri, ControleNos.calculaDistancia(ControleNos.getNo(1), pri));
        roteiros.add(priLink);
        roteiros.add(ultLink);

        return roteiros;
    }
    private static String CAMINHO = "Bibliotecas/Documentos";

    private String abrirArquivo() {
        try {
            JFileChooser fileChooser = new JFileChooser();
            FileNameExtensionFilter filterCw = new FileNameExtensionFilter("Clark Writgh", "cw");
            FileNameExtensionFilter filterFloyd = new FileNameExtensionFilter("Floyd", "fld");


            fileChooser.addChoosableFileFilter(filterCw);
            fileChooser.addChoosableFileFilter(filterFloyd);
            fileChooser.setFileFilter(filterCw);

            fileChooser.showOpenDialog(null);
            File arquivo = fileChooser.getSelectedFile();

            System.out.println("Arquivo aberta:" + arquivo.getPath().toString());
            return arquivo.getPath().toString();
        } catch (Exception e) {
            return null;
        }
    }

    private ArrayList<No> lerArquivo(String caminho) {
        this.caminho.setText(caminho);
        nos.clear();
        ArrayList<String> linhas = new ArrayList<String>();

        if (!caminho.isEmpty()) {
            try {
                FileReader file = new FileReader(new File(caminho));
                BufferedReader bf = new BufferedReader(file);

                String linha = null;
                while (bf.ready()) {
                    linha = bf.readLine();
                    linhas.add(linha);
                }

                nos = coordToNo(linhas);
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Apresentacao.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Apresentacao.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return nos;
    }

    private ArrayList<No> coordToNo(ArrayList<String> coords) {
        nos.clear();
        for (String linha : coords) {
            String[] l = linha.split(" ");
            if (l.length == 2) {
                No no = new No(Integer.parseInt(l[0]), Integer.parseInt(l[1]));
                nos.add(no);
            }
        }
        return nos;
    }

    /**
     * Insere os nós por arquivo ou pela tela de inserção
     */
    private void inserirNos(ArrayList<No> nos) {
        for (No no : nos) {
            int codigo = Controle.ControleNos.cadastraNo(no.getCoordenadaX(), no.getCoordenadaY());
            insereNoNaTela(no.getCoordenadaX(), no.getCoordenadaY(), codigo);
        }
    }

    private void salvarArquivo() {
        try {
            JFileChooser fileChooser = new JFileChooser();
            FileNameExtensionFilter filterCw = new FileNameExtensionFilter("Clark Writgh", "cw");
            FileNameExtensionFilter filterFloyd = new FileNameExtensionFilter("Floyd", "fld");


            fileChooser.addChoosableFileFilter(filterCw);
            fileChooser.addChoosableFileFilter(filterFloyd);
            fileChooser.setFileFilter(filterCw);

            fileChooser.showOpenDialog(null);
            File arquivo = fileChooser.getSelectedFile();

            System.out.println("Arquivo aberta:" + arquivo.getPath().toString());
//            return arquivo.getPath().toString();
        } catch (Exception e) {
//            return null;
        }

    }
}
